package com.godlei.security.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.configurers.HeadersConfigurer;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.header.HeaderWriter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @ClassName BasicAuthConfig
 * @Description Spring Security配置类
 * @Author 高达磊
 * @Date 2021/12/22-11:05
 * @Version 1.0
 */
@Configuration
public class BasicAuthConfig extends WebSecurityConfigurerAdapter {

    /**
     * 配置用户信息到内存中
     * 不配置用户信息时，Spring Security会创建默认的用户信息，用户名为：user，密码会输出在控制台中
     *
     * @param auth
     * @throws Exception
     */
//    @Override
//    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//        // 用户信息配置到内存中
//        auth.inMemoryAuthentication()
//                .withUser("godlei")
//                .password(new BCryptPasswordEncoder().encode("123456"))
//                // 角色不配置，启动报错：Cannot pass a null GrantedAuthority collection
//                .roles("admin");
//
//    }

    /**
     * 自定义登录界面
     *
     * @param http
     * @throws Exception
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {

        // 设置登录页面 1、controller接口的地址 2、页面（login.html），默认从resource/static目录找
        http.formLogin().loginPage("/basic/toLogin")
                // 处理登录信息的地址（security验证后的url）
                .loginProcessingUrl("/basic/login")
                // 登录成功跳转地址
                .successForwardUrl("/basic/toSuccess")
                // 登录失败跳转地址
                .failureForwardUrl("/basic/toFail")
                // 用户名字段名称，这里设置了登录页面也要改
                .usernameParameter("username")
                // 密码子段名称，这里设置了登录页面也要改
                .passwordParameter("password")
                // 设置不需要校验就能访问的地址
                .and().authorizeRequests().antMatchers("/basic/toLogin", "/basic/login").permitAll()
                // 所有请求都需要校验
                .anyRequest().authenticated()
                // 关闭跨站请求伪造防护
                .and().csrf().disable();

    }

    /**
     * 密码加密类不注入，报错：There is no PasswordEncoder mapped for the id "null"
     */
    @Bean
    public PasswordEncoder createPasswordEncoder() {
        return new BCryptPasswordEncoder();
    }

}
